package Compilador;
import java.util.LinkedList;
import java_cup.runtime.*;
%%
%cupsym simbolos
%class lexico
%standalone
%8bit
%cup
%unicode
%public
%line
%column
%char
%ignorecase
%state ESTRING
%state COMENTARIO1
%state COMENTARIO2
%eofval{
	return new Symbol(simbolos.EOF,yyline,yycolumn);
%eofval}
%{/*Crear un nuevo objeto java_cup.runtime.Symbol con información sobre el token actual sin valor*/
 
  private Symbol symbol(int type){
    return new Symbol(type,yyline,yycolumn);
  }
  LinkedList<NodoError> listaErrores;
  public void setListaErrores(LinkedList<NodoError> principal){
    listaErrores=principal;
  }
 /* Crear un nuevo objeto java_cup.runtime.Symbol con información sobre el token actual con valor*/
  private Symbol symbol(int type,Object value){
    return new Symbol(type,yyline,yycolumn,value);
  }

  String string = "";
%} 
/*-- MACRO DECLARACIONES --*/
id		= [a-zA-Z]([a-zA-Z]|[0-9]|"_")*
num_int		= ("-")?([0-9]+)
num_float		= ("-")?([0-9]+)(".")([0-9]+)
line_terminator	= \r|\n|\r\n
white_space    	= {line_terminator} | [ \t\f]
estring		= [\"]
comilla		= ([\\])([\"])
cualquiera	= .
%%
/*-------- Sección de reglas lexicas ------ */
<YYINITIAL>{

"<inicio>"			{ return symbol(simbolos.tinicio);			}
"<fin>"			{ return symbol(simbolos.tfin);		}
"Print"			{ return symbol(simbolos.tprint);			}
"Operacion" 	{ return symbol(simbolos.toperacion);		}
"Graficar" 		{ return symbol(simbolos.tGraficar);		}
{id} 			{ return symbol(simbolos.tid, yytext());		}
{num_int}		{ return symbol(simbolos.num_int, yytext());	}
{num_float}		{ return symbol(simbolos.num_float, yytext());	}

"("			{ return symbol(simbolos.parentesis_i);		}
")"   			{ return symbol(simbolos.parentesis_d);		}
";" 			{ return symbol(simbolos.punto_coma);		}
"," 			{ return symbol(simbolos.coma);		}
":" 			{ return symbol(simbolos.dos_puntos);		}
"*"			{ return symbol(simbolos.por);			}
"+"			{ return symbol(simbolos.plus);			}
"-"			{ return symbol(simbolos.menos);			}
{estring} 		{ yybegin(ESTRING); string = "";		}
{white_space}		{ 						}
"//"  			{ yybegin(COMENTARIO1);				}
"/*" 			{ yybegin(COMENTARIO2);				}
"/"			{ return symbol(simbolos.tdiv);			}
{cualquiera}		{ 	

NodoError nuevo=new NodoError();
nuevo.columna=String.valueOf(yyline);
nuevo.linea=String.valueOf(yycolumn);
nuevo.Descripcion="Error lexico ";
nuevo.palabra=yytext();
this.listaErrores.add(nuevo);

	}

}

<ESTRING>{
{estring} 		{ 	yybegin(YYINITIAL); 
				return symbol(simbolos.estring,"\""+string+"\""); }
[ \r\t\f]		{ string += yytext();			}
{comilla}		{ string += yytext();			}
{cualquiera}		{ string += yytext();			}

}

<COMENTARIO1>{
{cualquiera}		{					}
{line_terminator}	{	yybegin(YYINITIAL);		}
}

<COMENTARIO2>{
{cualquiera}		{					}
"*/" 			{ 	yybegin(YYINITIAL);		}
}
